
#pragma region CLASS_DESCRIPTION
/*
* =========================================================================================

* AUTHOR:      Physics Core Team (Ron Ram, Matt Hoyes, Randy Prieto, Kris Greene)
* DATE:        01/17/2012
*
* CLASS:       Circle2D Primitive Shape (Circle2D.h)
*
* DESCRIPTION:
* ---------------------------------------------------------------------------------------
*	This is a primitive 2D circle shape
*	All 2D shapes must implement all properties and behaviours described in 
*	Shape2D abstract class
* =========================================================================================
*/
#pragma endregion


#ifndef CIRCLE2D_H_
#define CIRCLE2D_H_


#include "Shape2D.h"

namespace Physics
{
	//Forward declaration
	class Box2D;

	class Circle2D : public Shape2D
	{
	private:
		//DATA MEMBERS...
		float radius;
		static int cir2D_InstanceCount; //count instance objects

	public:
		//---------- CONSTRUCTORS ----------
		Circle2D();																									//C001: Default Constructor
		Circle2D(const float radius, const Vector2 &pos);															//C002: Overloaded Constructor
		Circle2D(const float radius, const Vector2 &pos, const Vector2 &dir);										//C003: Overloaded Constructor
		Circle2D(const float radius, const Vector2 &pos, const Vector2 &dir, const float speed, const float mass);	//C004: Overloaded Constructor
		
		Circle2D(const Circle2D &circle);																			//C005: COPY Constructor
		Circle2D& operator=(const Circle2D &circle);																//C006: Assignment Operator
		virtual ~Circle2D();																						//C007: Virtual Destructor, in case this class is inherited later

		//---------- PROPERTIES ----------
		void setRadius(const float radius);						//M001: Setter Radius
		const float getRadius() const;							//M002: Getter Radius

		static const int count();								//M012: Getter Instance Count


		/***************************************************************
		-------------------------- IMPORTANT -------------------------- 
		***************************************************************
		In C++ pure abstract have to be re-defined in derived class,
		Opposite to C# style of coding
		****************************************************************/


#pragma region IPhysicsObject_Re-DEFINE_METHODs_AGAIN
		//	
		void Info();											//M013: Print Summary Info about instance object
#pragma endregion


#pragma region ICollision2D_Re-DEFINE_METHODS_AGAIN
		//COLLISION_2D
		bool collision(const Box2D &box);						//M003: THIS -> Box2D collision check
		bool collision(const Circle2D &circle);					//M004: THIS -> Circle2D collision check
#pragma endregion


#pragma region Shape2D_Re-DEFINE_METHODS_AGAIN
		//CENTER_LOCATION
		const Vector2 getCenter() const;						//M005: Getter Center

		//ROTATION_2D
		void rotateInDegs(const float degrees);					//M006: Rotate 2D shape using degrees
		void rotateInRads(const float radians);					//M007: Rotate 2D shape using radians

		//TRANSLATION_POSITION
		void translatePosition(const float X, const float Y);	//M008: Translate position using floats
		void translatePosition(const Vector2 &value);			//M009: Translate position using Vector2

		//TRANSLATION_DIRECTION
		void translateDirection(const float X, const float Y);	//M010: Translate direction using floats
		void translateDirection(const Vector2 &value);			//M011: Translate direction using Vector2
#pragma endregion

	};
} /* NAMESPACE */

#endif